<template>
  <div id="zb_app">
    <!-- 布局 -->
    <el-container style="margin-top:10px;">
      <!-- 头部 -->
      <el-header>
        <!-- form 表单 -->
        <el-form :inline="true" style="margin-top:20px;">
          <!-- 升序 降序 -->
          <el-form-item>
            <el-select size="mini" v-model="order">
              <el-option value="asc">升序</el-option>
              <el-option value="desc">降序</el-option>
            </el-select>
          </el-form-item>
          <!-- 图片搜索 -->
          <el-form-item>
            <el-input placeholder="输入图片名称" size="mini" v-model="keyword"></el-input>
          </el-form-item>
          <!-- 搜索按钮 -->
          <el-form-item>
            <el-button type="success" size="mini" @click="getImgList">搜索</el-button>
          </el-form-item>
        </el-form>
        <!-- 创建相册 上传图片 -->
        <div>
          <el-button type="primary" size="mini" v-show="ids.length>0" @click="changeDel">选中删除</el-button>
          <el-button type="success" size="mini" @click="dialogVisible = true">创建相册</el-button>
          <el-button type="warning" size="mini" @click="zb_upImg = true">上传图片</el-button>
        </div>
      </el-header>
      <!-- 中间区域 -->
      <el-container>
        <!-- 左侧区域 -->
        <el-aside>
          <ul>
            <li
              v-for="(item,index) in zb_imageClass"
              :key="index"
              :class="{act:item.id==cid}"
              @click.left="changeLeft(item.id)"
            >
              <span>{{item.name}}</span>
              <span>
                <el-dropdown @command="handleCommand">
                  <span class="el-dropdown-link">
                    {{item.images_count}}
                    <i class="el-icon-arrow-down el-icon--right"></i>
                  </span>
                  <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item command="zb_edit">修改</el-dropdown-item>
                    <el-dropdown-item command="zb_del">删除</el-dropdown-item>
                  </el-dropdown-menu>
                </el-dropdown>
              </span>
            </li>
          </ul>
        </el-aside>
        <!-- 右侧主要区域 -->
        <el-main>
          <!-- 右侧图片区域 -->
          <ul class="zb_ul">
            <li v-for="(item,index) in zb_imgList" :key="index">
              <el-image :src="item.url" :preview-src-list="[item.url]" />
              <p>{{item.name}}</p>
              <p>
                <input type="checkbox" v-model="ids" :value="item.id" class="button" />
                <el-button
                  type="text"
                  icon="el-icon-edit"
                  class="button"
                  @click="zb_EditImg(item,index)"
                ></el-button>
                <el-button
                  type="text"
                  icon="el-icon-delete"
                  class="button"
                  @click="zb_DelImg(item.id)"
                ></el-button>
              </p>
            </li>
          </ul>
        </el-main>
      </el-container>
      <!-- 底部 -->
      <el-footer>
        <!-- 分页器 -->
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="page"
          :page-sizes="[10,20, 30, 40]"
          :page-size="limit"
          layout="total, sizes, prev, pager, next, jumper"
          :total="totals"
        ></el-pagination>
      </el-footer>
    </el-container>
    <!-- 创建相册的弹框 -->
    <el-dialog title="创建相册" :visible.sync="dialogVisible" width="50%">
      <el-form>
        <el-form-item label="相册名称" :label-width="'80px'">
          <el-input v-model="class_name" placeholder="输入相册的名称"></el-input>
        </el-form-item>
        <el-form-item label="相册排序" :label-width="'80px'">
          <el-input-number v-model="class_order" laber="相册排序"></el-input-number>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addImg">确 定</el-button>
      </span>
    </el-dialog>
    <!-- 修改相册的弹框 -->
    <el-dialog title="修改相册" :visible.sync="dialogVisible1" width="50%">
      <el-form>
        <el-form-item label="相册名称" :label-width="'80px'">
          <el-input v-model="class_name1" placeholder="输入相册的名称"></el-input>
        </el-form-item>
        <el-form-item label="相册排序" :label-width="'80px'">
          <el-input-number v-model="class_order1" laber="相册排序"></el-input-number>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible1 = false">取 消</el-button>
        <el-button type="primary" @click="editImg">确 定</el-button>
      </span>
    </el-dialog>

    <!-- 上传图片 -->
    <el-dialog title="上传图片" :visible.sync="zb_upImg" width="50%">
      <div class="text-center">
        <el-upload
          class="upload-demo w-100"
          drag
          action="/admin/image/upload"
          multiple
          :headers="{ token:$store.state.token }"
          :data="{image_class_id:this.cid}"
          :on-preview="handlePreview"
          name="img"
          :on-success="uploadSuccess"
        >
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">
            将文件拖到此处，或
            <em>点击上传</em>
          </div>
          <div class="el-upload__tip" slot="tip">只能上传jpg/png文件，且不超过500kb</div>
        </el-upload>
      </div>
    </el-dialog>
    <!-- 图片预览弹框 -->
    <el-dialog title="图片预览" :visible.sync="previewVisible" width="50%">
      <img :src="previewPath" style="width:100%;" />
    </el-dialog>
    <!-- 图片预览弹框 -->
  </div>
</template>

<script>
//引入bottstrap样式
import "@/assets/bootstrap.css";
export default {
  // 组件名称
  name: "",
  // 组件参数 接收来自父组件的数据
  props: [],
  // 局部注册的组件
  components: {},
  // 组件状态值
  data() {
    return {
      order: "", //升序 降序
      keyword: "", //搜索关键字
      page: 1, //第一页
      limit: 10, //条数
      totals: 0, //总条数
      cid: "", //相册分类的id
      ids: [], //选中商品的id数组
      zb_imageClass: [], //侧边俩 相册分类 数据源
      zb_imgList: [], //图片列表数据
      dialogVisible: false, //创建相册的弹框 开关
      class_name: "", //添加相册的名称
      class_order: 0, //添加相册的排序
      dialogVisible1: false, //修改相册的弹框 开关
      class_name1: "", //修改相册的名称
      class_order1: 0, //修改相册的排序
      zb_upImg: false, //上传图片弹框 开关
      previewPath: "", //图片预览 路径
      previewVisible: false, //图片弹框开关控制
      pics: [] //图片的数组
    };
  },
  // 计算属性
  computed: {},
  // 侦听器
  watch: {},
  // 组件方法
  methods: {
    //获取图片相册列表
    getImageClass(flag = false) {
      this.$axios.get(`/admin/imageclass/1`).then(res => {
        console.log(res);
        this.zb_imageClass = res.data.data.list;
        this.cid = res.data.data.list[0].id;
        this.getImgList();
      });
    },
    //获取左侧图片数据
    getImgList() {
      this.$axios
        .get(
          `/admin/imageclass/${this.cid}/image/${this.page}?limit=${this.limit}&order=${this.order}&keyword=${this.keyword}`
        )
        .then(res => {
          console.log(res);
          this.zb_imgList = res.data.data.list;
          this.totals = res.data.data.totalCount;
        });
    },
    //点击左侧菜单栏进行切换
    changeLeft(id) {
      this.cid = id; //改变id的值
      this.page = 1;
      this.getImgList();
    },
    //分页条数
    handleSizeChange(val) {
      this.page = 1;
      this.limit = val;
      this.getImgList();
    },
    //分页页数
    handleCurrentChange(val) {
      this.page = val;
      this.getImgList();
    },
    //添加相册
    addImg() {
      //为空判断
      if (this.class_name == "" || this.class_order == "") {
        this.$message.error("相册名称和相册排序不能为空");
        return false;
      }
      //请求接口
      this.$axios
        .post("/admin/imageclass", {
          name: this.class_name,
          order: this.class_order
        })
        .then(res => {
          console.log(res);
          //创建成功
          this.$message.success("创建成功");
          //刷新列表
          this.getImageClass();
          //关闭弹框
          this.dialogVisible = false;
        })
        .catch(error => {
          //创建失败
          this.$message.error(error.response.data.msg);
          return false;
        });
    },
    //判断下拉菜单的事件
    handleCommand(command) {
      // this.$message("点击菜单触发" + command);
      if (command == "zb_edit") {
        this.dialogVisible1 = true;
      } else if (command == "zb_del") {
        this.$confirm("你确定要删除相册吗？删除可就不能恢复了幺", "提示", {
          type: "warning",
          confirmButtonText: "确定",
          cancelButtonText: "取消"
        })
          .then(() => {
            //确认
            //执行删除操作
            this.$axios
              .delete(`/admin/imageclass/${this.cid}`, { token: true })
              .then(res => {
                console.log(res);
                if (res.data.msg == "ok") {
                  //删除成功
                  this.$message.success("删除成功");
                  //刷新列表
                  this.getImageClass();
                }
              })
              .catch(error => {
                this.$message.error("删除失败");
                return false;
              });
          })
          //取消删除
          .catch(() => {
            this.$message("你已经取消删除用户");
          });
      }
    },
    //修改左侧菜单栏
    editImg() {
      //为空判断
      if (this.class_name1 == "" || this.class_order1 == "") {
        this.$message.error("相册名称和相册排序不能为空");
        return false;
      }
      //请求接口
      this.$axios
        .post(`/admin/imageclass/${this.cid}`, {
          name: this.class_name1,
          order: this.class_order1
        })
        .then(res => {
          console.log(res);
          if (res.data.msg == "ok") {
            //修改成功
            this.$message.success("修改成功");
            //刷新列表
            this.getImageClass();
            //关闭弹框
            this.dialogVisible1 = false;
          }
        })
        .catch(error => {
          //修改失败
          this.$message.error("修改失败");
          return false;
        });
    },
    //处理图片预览效果
    handlePreview(file) {
      console.log(file);
      this.previewPath = file.response.data.url;
      this.previewVisible = true;
    },
    // 上传成功
    uploadSuccess(response, file, fileList) {
      console.log(response, file, fileList);
      // 1.拼接得到一个图片信息对象
      let picInfo = { pic: response.data.path };
      // 2.将图片信息对象，push到pics数组中
      this.pics.push(picInfo);
      //3.上传成功弹框
      this.$message.success("上传成功");
      //4.关闭弹框
      this.zb_upImg = false; //关闭弹框
      //5.刷新列表
      this.getImageClass();
    },
    //删除单个图片
    zb_DelImg(id) {
      // console.log(id);
      this.$confirm("你确定要删除图片吗？删除可就不能恢复了幺", "提示", {
        type: "warning",
        confirmButtonText: "确定",
        cancelButtonText: "取消"
      })
        //确认删除
        .then(res => {
          this.$axios
            .delete(`/admin/image/${id}`)
            .then(res => {
              console.log(res);
              if (res.data.msg == "ok") {
                //删除成功
                this.$message.success("删除成功");
                //4.刷新列表
                this.getImageClass();
              }
            })
            //删除失败
            .catch(error => {
              this.$message.error("删除失败");
              return false;
            });
        })
        //取消删除
        .catch(() => {
          this.$message("你已经取消删除用户");
        });
    },
    //修改单个相册的名称
    zb_EditImg(item, index) {
      this.$prompt("请输入新名称", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        inputValue: item.name,
        inputValidator(val) {
          if (val === "") {
            return "图片名称不能为空";
          }
        }
      })
        .then(({ value }) => {
          this.$axios
            .post(
              "/admin/image/" + item.id,
              {
                name: value
              },
              {
                token: true
              }
            )
            .then(res => {
              //修改成功
              this.$message.success("修改成功");
              this.getImgList(); //刷新图片相册列表
            })
            .catch(error => {
              //修改失败
              this.$message.error("修改失败");
              return false;
            });
        })
        //取消删除
        .catch(() => {
          this.$message("你已经取消取消修改");
        });
    },
    //批量删除图片
    changeDel() {
      this.$confirm("你确定要删除图片吗？删除可就不能恢复了幺", "提示", {
        type: "warning",
        confirmButtonText: "确定",
        cancelButtonText: "取消"
      })
        //确认删除
        .then(() => {
          //调用接口
          this.$axios
            .post(`/admin/image/delete_all`, { ids: this.ids })
            .then(res => {
              console.log(res);
              if (res.data.msg == "ok") {
                //删除成功
                this.$message.success("删除成功");
                //刷新列表
                this.getImageClass();
              } else {
                this.$message.error("删除失败");
                return false;
              }
            });
        })
        //取消删除
        .catch(() => {
          this.$message("你已经取消删除图片");
        });
    }
  },
  // 以下是生命周期钩子   注：没用到的钩子请自行删除
  /**
   * 在实例初始化之后，组件属性计算之前，如data属性等
   */
  beforeCreate() {},
  /**
   * 组件实例创建完成，属性已绑定，但DOM还未生成，$ el属性还不存在
   */
  created() {},
  /**
   * 在挂载开始之前被调用：相关的 render 函数首次被调用。
   */
  beforeMount() {},
  /**
   * el 被新创建的 vm.$ el 替换，并挂载到实例上去之后调用该钩子。
   * 如果 root 实例挂载了一个文档内元素，当 mounted 被调用时 vm.$ el 也在文档内。
   */
  mounted() {
    this.getImageClass(true);
  },
  /**
   * 数据更新时调用，发生在虚拟 DOM 重新渲染和打补丁之前。
   * 你可以在这个钩子中进一步地更改状态，这不会触发附加的重渲染过程。
   */
  beforeUpdate() {},
  /**
   * 由于数据更改导致的虚拟 DOM 重新渲染和打补丁，在这之后会调用该钩子。
   * 当这个钩子被调用时，组件 DOM 已经更新，所以你现在可以执行依赖于 DOM 的操作。
   */
  updated() {},
  /**
   * keep-alive 组件激活时调用。 仅针对keep-alive 组件有效
   */
  activated() {},
  /**
   * keep-alive 组件停用时调用。 仅针对keep-alive 组件有效
   */
  deactivated() {},
  /**
   * 实例销毁之前调用。在这一步，实例仍然完全可用。
   */
  beforeDestroy() {},
  /**
   * Vue 实例销毁后调用。调用后，Vue 实例指示的所有东西都会解绑定，
   * 所有的事件监听器会被移除，所有的子实例也会被销毁。
   */
  destroyed() {}
};
</script>

<style lang="scss" scoped>
// 大盒子
.el-container {
  width: 100%;
  // 头部
  .el-header {
    width: 100%;
    background: #f5f5f5;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .el-container {
    // 侧边栏
    .el-aside {
      min-height: 500px;
      // overflow: scroll;
      background: #f0f0f0;
      overflow: auto;
      //导航栏
      ul {
        width: 100%;
        li {
          padding: 10px 8px;
          border-bottom: 1px solid #dddddd;
          display: flex;
          justify-content: space-between;
          cursor: pointer;
        }
        li.act {
          background: #f0f9eb;
          color: #67c23a;
        }
      }
    }
    .el-main {
      background: #f0f0f0;
    }
  }

  // 底部
  .el-footer {
    width: 100%;
    padding-top: 15px;
    background: #f0f0f0;
  }
}
//图片区域
.zb_ul {
  width: 100%;
  display: flex;
  flex-wrap: wrap;
  li {
    width: 30%;
    height: 250px;
    .el-image {
      width: 200px;
      height: 180px;
      border-radius: 5px;
    }
    .button {
      position: relative;
      bottom: 20px;
    }
  }
}
</style>
